/* 构造函数的初始化列表:
 * 可以指定当前对象成员变量的初始化方式
 * 成员变量的初始化和它们定义的顺序有关，和构造函数初始化列表中出现的先后顺序无关。
 * */
 
#include <iostream>
#include <cstring>
using namespace std;
class Test{
private:
    //成员变量的初始化和它们定义的顺序有关，和构造函数初始化列表中出现的先后顺序无关。
    int ma;
    int mb;
public:
    Test(int data=10):mb(data),ma(mb){

    }

    void show(){
        cout<<"ma:"<<ma<<" mb:"<<mb<<endl;
    }
};
int main(){
    Test t;

    //问题：输出的 ma,mb的值是多少？
    //答：只有mb的值是10，ma是无效值。
    //若定义顺序为 int mb,ma; 则输出都为 10
    t.show();
    return 0;
}

/*
class CDate{
private:
    int _year;
    int _month;
    int _day;
public:
    CDate(int y,int m,int d){       //自定义构造
        _year=y;
        _month=m;
        _day=d;
    }
    void show(){
        cout<<_year<<"/"<<_month<<"/"<<_day<<endl;
    }

};

class CGoods{
private:
    char _name[20];
    int _amount;
    double _price;
    CDate _date;        //成员对象  1、分配内存  2、调用构造函数
public:
    CGoods(const char *n,int a,double p,int y,int m,int d)
        : _date(y,m,d)
        ,_amount(a)
        ,_price(p){     //构造函数的初始化列表
        strcpy(_name,n);
    }
    void show(){
        cout<<"name:"<<_name<<endl;
        cout<<"amount:"<<_amount<<endl;
        cout<<"price:"<<_price<<endl;
        _date.show();
    }
};

int main(){
    CGoods good("goods",100,35.0,2019,5,12);
    good.show();

    return 0;
}
*/